import axios, { AxiosRequestConfig } from 'axios'
import qs from 'qs'
import store from '@/store'
import { Message } from 'element-ui'
import router from '@/router'
import { refreshToken } from '@/apis/user'
/**
 * 如果data是普通对象，content-type是application/json
 * 如果data是qs.stringify(data), content-type是application/x-www-form-urlencoed
 * 如果data是formData，content-type是multipart/form-data
 * 自动默认设置格式，可以不写headers
 */
let isRefresh = false // 防止多次调用刷新token接口

let requests: Function[] = [] // 记录401后所有请求失败的接口，等待token刷新成功之后再继续调用

const instance = axios.create({
  baseURL: process.env.VUE_APP_BASE_API
  // headers: { 'content-type': 'application/x-www-form-urlencoded' }
})

interface DefaultParams {
  platform?: string;
  /** 时间戳，防止部分环境接口缓存 */
  _t: number;
  token?: string;
}

instance.interceptors.request.use(config => {
  const defaultParams: DefaultParams = {
    // platform: getPlatform(),
    _t: +new Date()
  }
  if (config.method === 'get') {
    if (!config.params) {
      config.params = defaultParams
    } else {
      config.params = Object.assign({}, defaultParams, config.params)
    }
  } else {
    if (!config.data) {
      config.data = defaultParams
    } else {
      // config.data = qs.stringify(Object.assign({}, defaultParams, config.data))
    }
  }
  if (store.state.user) {
    config.headers.Authorization = store.state.user.access_token || ''
  }
  return config
})

instance.interceptors.response.use(response => {
  const res = response.data as any
  const whitelist = ['/front/user/getInfo', '/front/user/refresh_token', '/front/user/login']
  if (whitelist.indexOf((response.config.url) as string) === -1) {
    return Promise.resolve(res) as any
  } else {
    return Promise.resolve(res.content)
  }
}, error => {
  if (error.response) {
    // 请求发出去了，状态码超出了2xx范围
    // 400, 401, 403
    const status = +error.response.status
    if (status === 400) {
      Message.error('请求参数错误')
    } else if (status === 401) {
      // token无效
      if (!store.state.user) {
        router.push(`/login?redirect=${router.currentRoute.fullPath}`)
        Promise.reject(error)
      }

      if (!isRefresh) {
        (async function () {
          isRefresh = true
          try {
            const data = await refreshToken(store.state.user.refresh_token)
            // 刷新token成功后将401接口的再重新执行一遍，最后将数组清空
            requests.forEach(cb => cb())
            requests = []
            store.commit('setUser', data)
            // return await instance(error.config)
          } catch (e) {
            isRefresh = false
          }
        })()
      }
      // 将401的接口保存起来
      return new Promise(resove => {
        requests.push(() => {
          resove(instance(error.config))
        })
      })
    } else if (status === 403) {
      Message.error('没有权限,请联系管理员')
    } else if (status === 404) {
      Message.error('请求资源不存在')
    } else if (status >= 500) {
      Message.error('服务器内部错误')
    }
  } else if (error.request) {
    // 请求发出去没有收到响应
    Message.error('请求超时，请刷新重试')
  } else {
    // 设置请求时触发了错误
    Message.error(`请求失败，${error.message}`)
  }

  return Promise.reject(error)
})

// export default function request (config: AxiosRequestConfig) {
//   return instance(config);
// }

// const request = (config: AxiosRequestConfig) => instance(config)
export default (config: AxiosRequestConfig) => instance(config)
